4.3.3 使用映射
键值对赋值给映射,是通过指定适当类型的键并给这个键赋一个值来完成的,如代码清单4-48所示。
代码清单4-48 为映射赋值
// 创建一个空映射,用来存储颜色以及颜色对应的十六进制代码
colors := map[string]string{}
// 将Red的代码加入到映射
colors["Red"] = "#da1337"
可以通过声明一个未初始化的映射来创建一个值为 nil
的映射(称为 nil
映射)。 nil
映射不能用于存储键值对,否则,会产生一个语言运行时错误,如代码清单4-49所示。
代码清单4-49 对 nil
映射赋值时的语言运行时错误
// 通过声明映射创建一个nil映射
var colors map[string]string
// 将Red的代码加入到映射
colors["Red"] = "#da1337"
Runtime Error:
panic: runtime error: assignment to entry in nil map
测试映射里是否存在某个键是映射的一个重要操作。这个操作允许用户写一些逻辑来确定是否完成了某个操作或者是否在映射里缓存了特定数据。这个操作也可以用来比较两个映射,来确定哪些键值对互相匹配,哪些键值对不匹配。
从映射取值时有两个选择。第一个选择是,可以同时获得值,以及一个表示这个键是否存在的标志,如代码清单4-50所示。
代码清单4-50 从映射获取值并判断键是否存在
// 获取键Blue对应的值
value, exists := colors["Blue"]
// 这个键存在吗?
if exists {
fmt.Println(value)
}
另一个选择是,只返回键对应的值,然后通过判断这个值是不是零值来确定键是否存在,如代码清单4-51所示。①
代码清单4-51 从映射获取值,并通过该值判断键是否存在
// 获取键Blue对应的值
value := colors["Blue"]
// 这个键存在吗?
if value != "" {
fmt.Println(value)
}
在Go语言里,通过键来索引映射时,即便这个键不存在也总会返回一个值。在这种情况下,返回的是该值对应的类型的零值。
迭代映射里的所有值和迭代数组或切片一样,使用关键字 range
,如代码清单4-52所示。但对映射来说, range
返回的不是索引和值,而是键值对。
代码清单4-52 使用 range
迭代映射
// 创建一个映射,存储颜色以及颜色对应的十六进制代码
colors := map[string]string{
"AliceBlue": "#f0f8ff",
"Coral": "#ff7F50",
"DarkGray": "#a9a9a9",
"ForestGreen": "#228b22",
}
// 显示映射里的所有颜色
for key, value := range colors {
fmt.Printf("Key: %s Value: %s\n", key, value)
}
如果想把一个键值对从映射里删除,就使用内置的 delete
函数,如代码清单4-53所示。
代码清单4-53 从映射中删除一项
// 删除键为Coral的键值对
delete(colors, "Coral")
// 显示映射里的所有颜色
for key, value := range colors {
fmt.Printf("Key: %s Value: %s\n", key, value)
}
这次在迭代映射时,颜色Coral不会显示在屏幕上。